#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char **argv)
{
    #if 0
    //只读操作，不会自动创建文件，文件不存在则返回NULL
    FILE *fp = fopen("1.txt", "r");
    if(fp == NULL)
    {
        perror("fopen file fail");
        exit(1);
    }
    printf("success\n");
    #endif

    #if 0
    //读写操作，不会自动创建文件，文件不存在则返回NULL
    FILE *fp = fopen("1.txt", "r+");
    if(fp == NULL)
    {
        perror("fopen file fail");
        exit(1);
    }
    printf("success\n");
    #endif

    #if 0
    //只写操作，文件不存在会自动创建文件,文件存在并且有内容时，内容会被清空
    FILE *fp = fopen("1.txt", "w");
    if(fp == NULL)
    {
        perror("fopen file fail");
        exit(1);
    }
    printf("success\n");
    #endif

    #if 0
    //读写操作，文件不存在会自动创建文件,文件存在并且有内容时，内容会被清空
    FILE *fp = fopen("1.txt", "w+");
    if(fp == NULL)
    {
        perror("fopen file fail");
        exit(1);
    }
    printf("success\n");
    #endif

    #if 0
    //以只写操作，文件不存在会自动创建文件,文件存在并且有内容时，内容会被追加到后面
    FILE *fp = fopen("1.txt", "a");
    if(fp == NULL)
    {
        perror("fopen file fail");
        exit(1);
    }
    printf("success\n");
    #endif

    #if 1
    //读写操作，文件不存在会自动创建文件,文件存在并且有内容时，内容会被追加到后面
    FILE *fp = fopen("1.txt", "a+");
    if(fp == NULL)
    {
        perror("fopen file fail");
        exit(1);
    }
    printf("success fopen\n");
    #endif

    #if 0
    //使用fread函数读取数据到数组里面
    char *pbuf = (char *)malloc(sizeof(char) * 1024);
    if(pbuf == NULL)
    {
        perror("malloc pbuf fail");
        exit(1);
    }
    memset(pbuf, 0 ,1024);

    //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    //nmemb:需要读取数据块的数量
    //返回的ret实际是读取的数据块的数量，读取够设定的字节才能成为一个数据块，nmemb才会+1
    //但是不会返回小数，而是返回一个类似int类型的值，不会四舍五入
    int ret = fread(pbuf, 2, 1, fp);
    printf("pbuf:%s,ret:%d\n", pbuf, ret);
    ret = fread(pbuf, 2, 2, fp);
    printf("pbuf:%s,ret:%d\n", pbuf, ret);
    ret = fread(pbuf, 2, 3, fp);
    printf("pbuf:%s,ret:%d\n", pbuf, ret);

    //一次性读取完整
    ret = fseek(fp, 0, SEEK_SET);
    if(ret < 0)
    {
        perror("fseek fail");
        exit(1);
    }
    ret = fread(pbuf, 1, 1024, fp);
    printf("pbuf:%s,ret:%d\n", pbuf, ret);

    free(pbuf);
    #endif

    #if 0
    //对于fwrite，想写入多少块就写入多少数据块
    char buf[] = "ABCDEFGHIJKLNM";
    int ret = fwrite(buf, 2, 2, fp);
    printf("ret:%d\n", ret);
    ret = fwrite(buf, 2, 4, fp);
    printf("ret:%d\n", ret);
    
    //一次性全写
    ret = fwrite(buf, 1, strlen(buf), fp);
    printf("ret:%d\n", ret);

    #endif


    #if 0
    //获取指定文件的一个字符
    //返回的是字符的ASCII值
    printf("读取的字符:\n");
    int ch = getc(fp);
    printf("ASCII:%d,CHAR:%c\n",ch, ch);
    ch = fgetc(fp);
    printf("ASCII:%d,CHAR:%c\n",ch, ch);

    //功能：从标准输入（通常是键盘）读取一个字符。
    ch = getchar();
    printf("\n");
    printf("ASCII:%d,CHAR:%c\n",ch, ch);

    #endif

    #if 0
    //写入一个字符到指定文件
    //写入的是一个ASCII值
    printf("写入的字符:\n");
    int ch1 = putc(65, fp);
    printf("ASCII:%d,CHAR:%c\n",ch1, ch1);
    ch1 = fputc(66, fp);
    printf("ASCII:%d,CHAR:%c\n",ch1, ch1);
    ch1 = putchar(67);
    printf("ASCII:%d,CHAR:%c\n",ch1, ch1);

    #endif


    #if 0
    //从指定文件读取最多一行数据
    //文件读到最后一行或者文件读取失败的时候都返回NULL
    //char *fgets(char *s, int size, FILE *stream);
    char *pbuf = (char *)malloc(sizeof(char) * 1024);
    if(pbuf ==NULL)
    {
        perror("malloc pbuf fail");
        exit(1);
    }
    memset(pbuf, 0 ,1024);

    while(fgets(pbuf, 1024, fp) != NULL)
    {   
        printf("pbuf:%s", pbuf);
    }

    free(pbuf);
    #endif

    #if 0
    //向指定文件写入一行数据
    //成功返回一个非负整数，失败返回EOF
    //int fputs(const char *s, FILE *stream);
    char buf[] = "hello dgg\n";
    int ret = fputs(buf, fp);
    if(ret < 0)
    {
        perror("fputs fail");
        exit(1);
    }

    //键盘输入
    char buf1[20];
    memset(buf1, 0, 20);
    fgets(buf1, 20, stdin);
    ret = fputs(buf1, fp);
    if(ret < 0)
    {
        perror("fputs fail");
        exit(1);
    }
    printf("success fputs\n");
    #endif

    #if 0
    //设置指定文件的当前位置偏移量
    //成功返回0，失败返回-1
    //int fseek(FILE *stream, long offset, int whence);

    //成功返回当前位置偏移量，失败返回-1
    //获取指定文件的当前位置偏移量
    //long ftell(FILE *stream);

    //光标指向文件头
    //void rewind(FILE *stream);

    //lseek = fseek + ftell
    
    int ret = fseek(fp, 2, SEEK_SET);
    if(ret < 0)
    {
        perror("fseek fail");
        exit(1);
    }
    ret = ftell(fp);
    printf("offsize:%d\n", ret);

    rewind(fp);
    ret = ftell(fp);
    printf("offsize:%d\n", ret);
    #endif


    #if 1
    //关闭指定文件并释放资其资源
    pclose(fp);
    #endif

    return 0;
}